#region License
//-----------------------------------------------------------------------------
// Copyright (c) 2008, Aaron MacDougall, Daniel Jeffery
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
//   this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright notice,
//   this list of conditions and the following disclaimer in the documentation
//   and/or other materials provided with the distribution.
//
// * Neither the name of Aaron MacDougall or Daniel Jeffery nor the names of its contributors may
//   be used to endorse or promote products derived from this software without
//   specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//-----------------------------------------------------------------------------
#endregion

#region Using Statements
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
#endregion

namespace Agro2D
{
    public class FrameRateCounter : DrawableGameComponent
    {
        #region Cstors/Dstors
        /// <summary>
        /// Constructor.
        /// </summary>
        /// <param name="game">Reference to game</param>
        /// <param name="fontAssetName">Name & path to font asset</param>
        /// <param name="enabledOnStart">If FPS should be enabled on start</param>
        public FrameRateCounter(Game game, string fontAssetName, bool enabledOnStart)
            : base(game)
        {
            content = new ContentManager(game.Services);
            this.fontAssetName = fontAssetName;
            this.Enabled = enabledOnStart;
        }
        #endregion

        #region Public Interface
        public override void Update(GameTime gameTime)
        {
            if(!this.Enabled) return;

            elapsedTime += gameTime.ElapsedGameTime;

            if(elapsedTime > TimeSpan.FromSeconds(1))
            {
                elapsedTime -= TimeSpan.FromSeconds(1);
                frameRate = frameCounter;
                frameCounter = 0;
            }
        }


        public override void Draw(GameTime gameTime)
        {
            if(!this.Enabled) return;

            frameCounter++;

            string fps = string.Format("fps: {0}", frameRate);

            spriteBatch.Begin();

            spriteBatch.DrawString(spriteFont, fps, postion, Color.Black);
            spriteBatch.DrawString(spriteFont, fps, new Vector2(postion.X - 1, postion.Y - 1), Color.White);

            spriteBatch.End();
        }
        #endregion

        #region Private Interface
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            spriteFont = content.Load<SpriteFont>(fontAssetName);
        }
        protected override void UnloadContent()
        {
            content.Unload();
        }
        #endregion

        #region Properties
        public int FrameRate
        {
            get { return frameRate; }
        }

        public Vector2 Position
        {
            get { return postion; }
            set { postion = value; }
        }
        #endregion

        #region Attributes
        ContentManager content;
        SpriteBatch spriteBatch;
        SpriteFont spriteFont;
        Vector2 postion = new Vector2(33, 33);

        int frameRate = 0;
        int frameCounter = 0;
        TimeSpan elapsedTime = TimeSpan.Zero;

        string fontAssetName;
        #endregion

    }
}
